#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/common.h>
#include <cstdlib>
#include <cmath>

// 生成一个随机数在[min, max]之间
float random_float(float min, float max) {
    return min + static_cast<float>(rand()) / (static_cast<float>(RAND_MAX / (max - min)));
}

// 生成球面点云
pcl::PointCloud<pcl::PointXYZ>::Ptr generate_sphere_point_cloud(float radius, int num_points) {
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());

    for (int i = 0; i < num_points; ++i) {
        // 随机生成球面上的点
        float theta = random_float(0.0, 2 * M_PI); // 随机生成[0, 2pi]之间的角度
        float phi = random_float(0.0, M_PI); // 随机生成[0, pi]之间的角度

        // 使用球坐标系公式计算点的3D坐标
        float x = radius * sin(phi) * cos(theta);
        float y = radius * sin(phi) * sin(theta);
        float z = radius * cos(phi);

        cloud->points.push_back(pcl::PointXYZ(x, y, z));
    }

    cloud->width = cloud->points.size();
    cloud->height = 1; // 无序点云
    cloud->is_dense = true;

    return cloud;
}

int main(int argc, char** argv) {
    // 设置点云参数
    float radius = 1.0; // 球半径
    int num_points = 1000; // 点的数量

    // 生成点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = generate_sphere_point_cloud(radius, num_points);

    // 保存点云到PCD文件
    pcl::io::savePCDFileASCII("sphere_point_cloud.pcd", *cloud);
    // std::cout << "生成了 " << cloud->points.size() << " 个点的球面点云,并保存到sphere_point_cloud.pcd 文件中" << std::endl;

    // 可视化点云
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    viewer->setBackgroundColor(0, 0, 0);
    viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "sample cloud");
    viewer->addCoordinateSystem(1.0);
    viewer->initCameraParameters();

    // 保持可视化窗口
    while (!viewer->wasStopped()) {
        viewer->spinOnce(100);
    }

    return 0;
}
